package com.whz.generic.template;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * <p> freemarker模板引擎辅助类,绑定数据到指定的模板, 例如下模板:</p>
 * <mapper namespace="${mapperName}">
 * <#list methodList as method>
 * <#if "${method.sqlType}" =="select">
 * <select id="${method.methodName}"  resultType="${method.type}">
 * ${method.desc}
 * </select>
 * <#elseif "${method.sqlType}" == "insert">
 * <insert id="${method.methodName}" resultType="${method.type}">
 * ${method.desc}
 * </insert>
 * </#if>
 * </#list>
 * </mapper>
 *
 * @author whz
 */
@Slf4j
@UtilityClass
public class FreeMarkerTemplateUtils {


    /**
     * 从指定目录dictionary,加载名称为templateName的模板
     *
     * @param templateName 目录
     * @param dictionary   末班名称
     * @return freemarker模板
     */
    @SneakyThrows
    public static Template getDefinedTemplate(String dictionary, String templateName) {
        //配置类
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
        cfg.setDirectoryForTemplateLoading(new File(dictionary));
        cfg.setDefaultEncoding(StandardCharsets.UTF_8.name());
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        return cfg.getTemplate(templateName);
    }

    /**
     * 对目录dictionary的模板文件templateName绑定数据data,返回绑定结果文本
     *
     * @param dictionary   目录
     * @param templateName 模板文件名
     * @param data         待绑定数据
     * @return 绑定文本
     */
    public static String bind(String dictionary, String templateName, Map<String, Object> data) {
        try (StringWriter out = new StringWriter()) {
            getDefinedTemplate(dictionary, templateName).process(data, out);
            return out.toString();
        } catch (Exception e) {
            throw new RuntimeException("bind key to template error.", e);
        }
    }
}